<?php

namespace App\Console\Gather;


use App\Models\SiteStock;
use QL\QueryList;

class _Cs extends Base
{

    // 中国证券报采集
    /**
     * 请求：
     *  php artisan command:gather-cs
     *  sudo -u www php /www/wwwroot/slh/laravel.test/artisan command:gather-cs
     *
     */
    /**
     * 参数与选项的区别
     *      在执行命令时，参数必须严格按定义时的顺序输入，不需输入参数名，只需输入参数的值即可。
     *      输入选项则必须带选项名，且选项名前须加 -- 前缀（选项简写字母前加 -），选项可按任意顺序输入
     */

    // 请求 以及参数
    // protected $signature = 'command:name {param1} {param2}';  // 必填参数
    // protected $signature = 'command:name {参数名?} {参数名=默认值} {参数名? : 参数说明}';  // 可选参数
    // protected $signature = 'command:name {--选项名} {--选项名=} {--选项名=默认值} {--简写字母|选项名} {--选项名 : 选项说明}';  // 选项
    protected $signature = 'command:gather-cs';

    protected $description = '中国证券报：从中国证券报采集：公司，市场，基金';
    protected $ctsDb;
    protected $toDb;


    // 执行的命令
    public function handle()
    {
        // TODO 采集的人，发布的群
        $weIds = [61]; // 群发
        $time  = time();
        $uid   = 10203;    // 中国证券报

        // 获取所有的股票信息
        $stockDb = new SiteStock();
        $stocks  = $stockDb->get()->toArray();

        // 中国证券报：公司内容采集
        $this->company($stocks, $uid, $time, $weIds);

        // 从新浪财经：研报网站采集数据
        // $this->stock($stocks,$uid, $time, $weIds);

        // 从股吧网站采集数据
        // $this->guba($stocks,$uid, $time, $weIds);
    }

    // 中国证券报：公司内容采集
    protected function company($stocks, $uid, $time, $weIds, $page = 1, $row = 10)
    {
        // 获取数据
        $page     = 1;
        $row      = 2;  // 采集 10 条
        $columnId = 3091870;
        $result   = $this->_gatherList($columnId, $page, $row);
        if(empty($result)){
            return false;
        }

        $lists = $result['lists'];
        $today = strtotime(date('Y-m-d'));

        // 采集详情
        // 采集和pc端的一样 因为页面会自动转跳到pc端
        foreach($lists as $key => $item){
            $res = $this->_gatheShow($stocks, $item, $key, $today, $uid);
        }

        return true;
    }

    // 中国证券报：市场内容采集

    // 中国证券报：基金内容采集

    // 采集文章详情
    protected function _gatheShow($stocks, $item, $key, $today, $uid)
    {
        $_title  = $item['title'];
        $_author = $item['author'];
        $_ctime  = $item['createTimeEpochMilli'] / 1000;  // 时间
        $_artId  = $item['articleId'];
        $_desc   = $item['content'];
        $_href   = 'https://m.cs.com.cn/#/article/'.$_artId;
        $apiUrl  = 'https://m.cs.com.cn/api/h5/article/info?articleId='.$_artId;
        // 判断链接是否已经采集
        $info = $this->isGather($_href);
        if($info){
            $this->showMsg(' '.($key + 1).'：==> 已经采集文章：'.$_title);

            return false;
        }

        // 只采集今天的
        if($_ctime < $today){
            $this->showMsg(' '.($key + 1).'：==> 文章：不是今天的文章：'.$_title);

            return false;
        }

        // 如果没有标题
        if(empty($_title)){
            return false;
        }
        // 查询
        $this->showMsg(' '.($key + 1).'：==> 采集文章：'.$_title);

        // 执行返回的数据
        $res  = $this->curl()->request($apiUrl);
        $res  = json_decode($res, true);
        $code = $res['code'];
        // 返回采集的内容
        if($code != 200){
            $_message = $res['message'];
            $this->showMsg(' 内容：'.$_message);

            return false;
        }

        $data = $res['data'];
        if(empty($data)){
            $this->showMsg('   内容：没有需要采集的数据');

            return false;
        }


        // 如果有 p 标签
        $_text = $data['content'] ?? '';
        if(empty($_text)){
            $this->showMsg('   内容：采集的内容为空');

            return false;
        }

        // 整理每一段话
        $_ql   = QueryList::html($_text);
        $rule  = ['html' => ['', 'html'], 'text' => ['', 'text']];
        $list  = $_ql->range('p')->rules($rule)->queryData();
        $_text = '';
        $_desc = '';
        if($list){
            foreach($list as $_item){
                // 这里不直接用 $_item['text']  避免里面有图片
                $_rangeHtml = $this->removeHtml($_item['html']);
                if(empty($_rangeHtml)){
                    continue;
                }
                if(empty($_desc) && (strpos($_rangeHtml, '记者') === false) && (strpos($_rangeHtml, '转自') === false) && (strpos($_rangeHtml, '|') === false) && (strpos($_rangeHtml, '来源') === false)){
                    $_desc = $_rangeHtml;
                }
                $_text .= '<p style="padding: 3px 0;">'.$_rangeHtml.'</p>';
            }
        }

        // 对比股票信息
        $_has = [];  // 用股票的id
        foreach($stocks as $sit){
            $_name = $sit['name'];
            if(strpos($_text, $_name) !== false){
                $_has[] = $sit['id'];
            }
        }

        // echo chr(10).chr(10).chr(10);
        var_dump($_title);
        var_dump($_href);
        var_dump($_ctime);
        var_dump($_desc);
        //var_dump($_text);
        //var_dump($_has);

        // var_dump($today);
        //var_dump($_html);
        //$this->showMsg('      ==> 保存到数据库：'.$_title);
        //$this->saveArticle($uid, $_href, $_title, $_desc, $_text, $time,$_author = '', $is_show = false, $_has);
        //$this->showMsg('      ==> 发送到微信：'.var_export($weIds, 1));
        //$this->wechat($_title, $_href, $weIds);

        return true;
    }

    // 采集列表操作
    protected function _gatherList($columnId, $page = 1, $row = 10)
    {
        // 获取列表
        $url  = 'https://m.cs.com.cn/api/h5/article/page?pageNo='.$page.'&pageSize='.$row.'&columnId='.$columnId;
        $res  = $this->curl()->request($url); // 采集返回的是 try 需要整理成json
        $rst  = json_decode($res, true);
        $code = $rst['code'];

        // 返回采集的内容
        if($code != 200){
            $_message = $rst['message'];
            $this->showMsg(' '.$_message);

            return false;
        }

        // 整理数据内容
        $data = $rst['data'] ?? [];
        if(empty($data)){
            $this->showMsg('   没有需要采集的数据');

            return false;
        }

        // 整理具体数据
        $lists = $data['result'] ?? [];
        $total = $data['total'] ?? 0;
        if(empty($lists)){
            $this->showMsg('   没有需要采集的数据');

            return false;
        }

        return ['lists' => $lists, 'total' => $total];
    }
}

